Transitions: animate views as they appear and disappear - #45
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The deferred half of the animation tier:
.transition(_:)animates a view as it is inserted into or removed from a stack (typically insidewithAnimation).What's new
AnyTransition—.opacity,.slide,.scale,.move(edge:),.identity;.transition(_:)modifier.VStack/HStack/ZStackin anAnimatedVisibilitywhose enter/exit is derived from the transition kind (timing follows the activewithAnimationspec, else a 300ms tween).The interesting part
A child removed from the Swift tree is simply gone from
node.children, so there's nothing left to animate out. Each stack keeps a slot per transition child (its last node + aMutableTransitionState); when the child leaves, its slot lives on withtargetState = falseso the exit plays, then evicts when idle. Crucially, present and exiting children render through one unifiedkey(id)-ed loop — my first cut used two loops, and the child hopping call sites made Compose tear it down instead of animating (bug caught on-device via a state-log; the two-loop version removed instantly).Verification
swift test— new emission test, 66 total passingMutableTransitionStatelog showscuranimating true→false over ~400ms — a real exit, not a snapDeferred
Asymmetric transitions (
.asymmetric),.combined(with:), and perfectly in-place exit ordering when multiple siblings leave at once (exiting children are appended, which is in-place for the common single-optional-child case).